//
//  std::move.hpp
//  learnC++
//
//  Created by liuzhibing on 2018/6/28.
//  Copyright © 2018年 yunfan.com. All rights reserved.
//

#ifndef std__move_hpp
#define std__move_hpp

#include <stdio.h>
#include <iostream>
#include <utility>

//在C ++ 11中，std :: move是一个标准的库函数，可用于单一目的 - 将其参数转换为r值。 我们可以将一个l值传递给std :: move，它将返回一个r值引用。 std :: move在工具头中定义。
template <class T>
void swap(T &a,T &b){
    T tmp{std::move(a)};
    a = std::move(b);
    b = std::move(tmp);
}

/*
 std::string x{ "abc" };
 std::string y{ "de" };
 
 std::cout << "x: " << x << '\n';
 std::cout << "y: " << y << '\n';
 
 swap(x, y);
 
 std::cout << "x: " << x << '\n';
 std::cout << "y: " << y << '\n';
 */

//数组中最好使用移动语义例如向std中添加数据
//为什么使用r值？ 因为r值是暂时的，我们知道它们在使用后会被销毁。 当按值传递或返回r值时，制作副本然后销毁原始代码是浪费的。 相反，我们可以简单地移动（窃取）r值的资源，这通常更高效。


#endif /* std__move_hpp */
